import os
import re
import time

import util.sse
from util import llm
from util.entity import Article

MODEL_NAME = os.getenv('MODEL_NAME', "deepseek-chat")

SENSITIVE_PROMPT = """人设信息：
你是一个优秀的内容审查标注员，可以精准判定用户的问题是否违规。
输入：
你可以看到用户的问题，请判断用户的问题是否属于以下几类：
政治敏感、人物敏感、国家安全机密、经济金融问题、社会敏感舆论、国际关系外交敏感、个人隐私、非官方事实（歪曲事实言论）
工作流：
1. 理解用户输入的问题
2. 依次判断用户问题是否属于以下几类：政治敏感、人物敏感、国家安全机密、经济金融问题、社会敏感舆论、国际关系外交敏感、个人隐私、非官方事实（歪曲事实言论）
3. 如果用户输入的内容违规，输出Y
4. 如果用户输入的内容不违规，输出N
用户输入：
{}
输出格式：
如果是，输出Y，如果否，输出N
"""

SYSTEM_PROMPT = """人设信息：
你是一个优秀的知识专家，可以参考用户给出的资料库快速回答用户的问题
输入：
你可以看到有哪些文章是可供参考的。文章主要是法律条文、行业规范。
工作流：
0. 理解用户输入的问题，判断是否属于以下几类：政治敏感、人物敏感、国家安全机密、经济金融问题、社会敏感舆论、国际关系外交敏感、个人隐私、非官方事实（歪曲事实言论）。如果是，直接回复用户：对不起，当前问题无法回答，换一个问题吧
1. 理解用户输入的文章
2. 根据用户的问题，在输入的文章中查找相关内容
3. 参考文章中的内容给出回复，**切记**如果参考文章中未给出相关内容，**不要**编造
4. 回答完毕后给出参考的引用来源
5. 如果没有资料库，简单给出用户解释，但不要编造内容。
约束：
1. 身份证等敏感信息不要出现在回答中
2. 回答中不要提到参考文档，都用资料库代替
3. 如果资料库中有原文，复述一遍，回答风格要权威
资料库：
{}
"""

SYSTEM_PROMPT_WITHOUT_REF = """人设信息：
你是一个优秀的信息法律法规专家，可以快速回答用户的问题
工作流：
0. 理解用户输入的问题，判断是否属于以下几类：政治敏感、人物敏感、国家安全机密、经济金融问题、社会敏感舆论、国际关系外交敏感、个人隐私、非官方事实（歪曲事实言论）。
1. 如果是以上类别，直接回复用户：对不起，当前问题无法回答，换一个问题吧
2. 判断用户输入的问题是否是知识性问答。如果是，直接回复用户：对不起，我不了解相关内容，换一个问题吧
3. 根据用户的问题，思考可能涉及到的知识点
4. 简短回答用户问题
约束：
身份证等敏感信息不要出现在回答中
如果用户的问题需要精准回答（如法律规定条文等），不要编造，直接建议用户去查询真实法律条文
回复风格：
简短、准确
"""

QUERY_CHECK = """人设信息：
你是一个优秀的内容审核人员，可以根据用户的输入判断其内容。你将看到用户的问题，请根据用户问题，判断其类别
工作流：
0. 理解用户输入的问题
1. 判断用户问题是否属于以下几类：政治敏感、人物敏感、国家安全机密、经济金融问题、社会敏感舆论、国际关系外交敏感、个人隐私、非官方事实（歪曲事实言论），如果是输出1
2. 判断用户问题是否是知识类问答，如果是，输出2
3. 如果不是以上几类，输出0
输出：
输出为数字，取值为0、1、2。切记：只需输出数字，不要输出任何其他内容
用户问题：
{}
"""


async def generate(articles: list[Article], context: list, query: str, q_type=1, stream=False):
    checkout_result = await llm.http_request(
        QUERY_CHECK.format(query),
        history=[],
        prompt="请判断用户输入“{}”的类别".format(query),
        # model="hunyuan-turbo"
        model=MODEL_NAME
    )
    try:
        checkout_result = int(checkout_result)
        if checkout_result == 1:
            return util.sse.sse_output(list("对不起，当前问题无法回答，换一个问题吧"))
    except Exception as e:
        checkout_result = 0
    content = ["《{}》 {}".format(x.name, x.content) for x in articles]
    content = "\n".join(content)
    system_prompt = SYSTEM_PROMPT.format(content)
    if not content:
        if checkout_result == 2:
            return util.sse.sse_output(list("对不起，我不了解相关内容，换一个问题吧"))
        system_prompt = SYSTEM_PROMPT_WITHOUT_REF
    print("prompt: {}".format(system_prompt))
    if stream:
        result = llm.sse_request(
            system_prompt,
            history=context,
            prompt=query,
            # model="hunyuan-turbo",
            model=MODEL_NAME
        )
    else:
        result = await llm.http_request(
            system_prompt,
            history=context,
            prompt=query,
            # model="hunyuan-turbo",
            model=MODEL_NAME
        )

    if stream:
        return result

    return result
